#include <cstdio>

class A
{
	public:
		A()
		{
			Print();
		}
		virtual void Print()
		{
			printf("A is constructed.\n");
		}
};

class B : public A
{
	public:
		B()
		{
			Print();
		}
		virtual void Print()
		{
			printf("B is constructed.\n");
		}
};

int main(int argc, char* argv[])
{
	A* pA = new B();
	delete pA;

	return 0;
}

/*答案：先后打印出两行:A is constructed. B is constructed. 调用B的构造函数时，先会调用B的基类及A的构造函数。然后在A的构造函数里调用Print。由于此时实例的类型B的部分还没有构造好，本质上它只是A的一个实例，他的虚函数表指针指向的是类型A的虚函数表。因此此时调用的Print是A::Print，而不是B::Print。接着调用类型B的构造函数，并调用Print。此时已经开始构造B，因此此时调用的Print是B::Print。

同样是调用虚拟函数Print，我们发现在类型A的构造函数中，调用的是A::Print，在B的构造函数中，调用的是B::Print。因此虚函数在构造函数中，已经失去了虚函数的动态绑定特性。*/
